home *** CD-ROM | disk | FTP | other *** search
Text File | 2000-10-06 | 2.5 KB | 117 lines | [TEXT/CWIE] |
-
- //-----------------------------------------------------------------
- // SWFixed - fixed point routines for SpriteWorld
- //
- // Written by Anders F Björklund <afb@algonet.se>
- // © 1995-2000 afb
- //
- // Thanks to Anton Kirzenow for inspiration.
- //-----------------------------------------------------------------
-
- #include <SWFixed.h>
-
- long gSWNumAngles = 0;
- SWFixed *gSWSinTable = NULL;
- SWFixed *gSWCosTable = NULL;
-
- static SWFixed *gSWTrigTable = NULL;
-
- #define PI 3.1415926535898
- #define ACCURACY 10
-
- OSErr SWInitTrigTables(short numAngles)
- {
- SWFixed *table;
- double ang,delta;
- double sum,sign,sqr,power,fact,one = 1.0;
- double inv_factorials[ ACCURACY ];
- short numAngles2 = numAngles >> 1,
- numAngles4 = numAngles >> 2,
- numAngles8 = numAngles >> 3;
- SWFixed trig;
- long a,i;
-
- table = (SWFixed *) NewPtr( sizeof(SWFixed) * (numAngles+numAngles4+1) );
- if ( table == NULL )
- return memFullErr;
-
- delta = one;
- ang = one;
-
- // precompute inverse factorials for speed
- fact = one;
- for (i=0; i < ACCURACY; i++)
- {
- fact *= ang;
- inv_factorials[i] = one / fact;
- ang += delta;
- }
-
- delta = (2.0 * PI) / (double) numAngles;
- ang = 0.0;
-
- for (a = 0; a < numAngles8; a++)
- {
- // calculate sin by sums
- sqr = ang * ang;
- sum = ang;
- sign = -one;
- power = ang * sqr;
- for (i=3; i < ACCURACY; i+=2)
- {
- sum += sign * power * inv_factorials[i-1];
- sign = -sign;
- power *= sqr;
- }
-
- // convert to fixpoint
- trig = SW_FLOAT2FIX( sum );
-
- // store in table
- table[a] = +trig; // first quadrant
- table[numAngles2 - a] = +trig; // second quadrant
- table[a + numAngles2] = -trig; // third quadrant
- table[numAngles - a] = -trig; // fourth quadrant
-
- table[a + numAngles] = trig; // "fifth" quadrant (same as first - for cos)
-
- ang += delta;
- }
-
- ang = (- PI / 4.0);
-
- for (a = numAngles8; a <= numAngles4; a++)
- {
- // calculate cos by sums
- sqr = ang * ang;
- sum = one;
- sign = -one;
- power = sqr;
- for (i=2; i < ACCURACY; i+=2)
- {
- sum += sign * power * inv_factorials[i-1];
- sign = -sign;
- power *= sqr;
- }
-
- // convert to fixpoint
- trig = SW_FLOAT2FIX( sum );
-
- // store in table
- table[a] = +trig; // first quadrant
- table[numAngles2 - a] = +trig; // second quadrant
- table[a + numAngles2] = -trig; // third quadrant
- table[numAngles - a] = -trig; // fourth quadrant
-
- table[a + numAngles] = trig; // "fifth" quadrant (same as first - for cos)
-
- ang += delta;
- }
-
- gSWTrigTable = table;
- gSWNumAngles = numAngles;
- gSWSinTable = table;
- gSWCosTable = table + numAngles4;
- return noErr;
- }
-